#ifndef _GLOBALVAR_H
#define _GLOBALVAR_H

#include"headfile.h"

/*********************************************************************************************************************
 * @file       		GlobalVar.h
 * @brief      		定义各种全局变量、宏定义及结构体
 * @note



 ********************************************************************************************************************/


 //================================================宏定义==========================================================//



//==================舵机=============
#define INITDUTY 4775 		//舵机初始角度
#define STEERCORNER 600		//舵机最大角度

//=================液晶==============
#define _USE_LCD 1
#define _USE_IPS 0
#define HEAD_MAX_WORD 15	//页面标题最大字数
#define LINE_MAX 8			//一行最大字数
#define MAX_WORD 9
#define SCREEN_DEPART 88
#define DOT_SIZE 2                  // 小数点后数位
//=================电机=============
//电机输出限幅
#define SPEED_OUT_MAX  49999  //正转最大
#define SPEED_OUT_MIN -49999  //反转最大

//速度选择
// #define BASICLINE 42		//加减速基准行


//=================补图=============
#define UP_EDGE 25      //补图上边界
#define DOWN_EDGE 70    //补图下边界
#define LEFT_EDGE 0		//补图左边界
#define RIGHT_EDGE 187	//补图右边界

#define MID 94			//图像中线
#define IMG_ROW	120		//图像行数
#define IMG_COL 188	//图像行列数

// #define IN_OFFSET 2 //向内偏移

// #define FINDLINE_TH 7		//搜线阈值


//==================惯性导航====================
// extern int Navagition_Dir;                 //0不出库，1左，2右
#define ONE_METER		5800	//一米




 //================================================定义结构体==========================================================//

typedef struct
{
	float error_1;//偏差
	float error_2;
	float error_3;
	int d_duty; //输出偏差项
	float p;
	float i;
	float d;
}SPEED;             //定义速度类型结构体

typedef struct
{
	float error_1;
	float error_2;
	float p;
	float d;
	int steer_duty;
}STEER;			//定义舵机控制类型结构体


typedef struct
{
	int Row;
	int Col;
}Point;


typedef struct
{
	int Type;               //0普通情况 1内跳 2外跳 3拐点 4上边界 5左边界 6右边界 7首行丢边 8：4类十字补线 9结束循环
	int ErrRow; 
	int ErrCol;
}SpecialPoint;

typedef struct
{
        float steer_P;
        float steer_D;
        float speed_P;
        float speed_I;
        int relSpd;
        int steer_duty;
        int spd_exp;
}test_status;







//-------枚举类型-------
// enum GarageState
// {
// 	G_OFF,
// 	G_OUT,
// 	G_IN
// };


enum EdgeType
{
	NO, HIGH_TH, LOW_TH
};//Canny边缘判断


enum CircleType
{
	CN, CL, CR
};//环岛状态判断

enum FD
{
	FN,
	FL,
	FR
};//三岔方向枚举



 //================================================定义全局变量==========================================================//

//==================舵机====================
extern int SteerDuty;           //舵机打角占空比
extern int SteerError;			//舵机误差
extern int8 g_steer_open;			//舵机开关标志
extern int SteerDutySet;	//舵机关闭时手动设置舵机的角度
// extern STEER steerC;	//舵机控制使用的结构体
extern float p_max ;			//舵机动态P_MAX
extern float p_min ;			//舵机动态P_MIN
extern float Steer_P;         //舵机控制的P
extern float Steer_P_CI;		//环岛p
extern float Steer_D;        //舵机PID的D
// extern float Steer_P_Ramp;              //坡道p
// extern float Steer_P_Cross;              //大环p
// extern float Steer_D1;     //入弯D
// extern float Steer_D2;     //出弯D
extern int ControlMid; //控制中点
extern int Error_1;          //舵机偏差1
extern int Error_2;          //舵机偏差2

// extern int MaxSteerDuty5;  //环岛状态5舵机最大值

//==================键盘====================
 extern char g_Key;              //键盘返回值

//--------液晶------

//==================电机、速度控制====================
extern int rCurSpeed;		//右轮速度
extern int lCurSpeed;		//左轮速度
extern float leftExpect;		//左轮期望速度
extern float rightExpect;	//右轮期望速度
extern int CurSpeed;			//速度
extern int speed_type;		//用于选择速度的类型
extern int leftSpeedOut;		//左轮最终输出速度
extern int rightSpeedOut;	//右轮最终输出速度

extern int spdExp;		//最终期望速度
extern const int spdExp0;	        //停车速度
extern int spdExp1;		//平跑速度,15
extern int spdExp2;		//小弯速度,10
extern int spdExp3;		//过弯速度（大）,8
extern int spdExp4;		//射击速度，6
extern int spdExp5;		//环岛速度 8
extern int spdExp6;		//上位机速度
extern char test_flag;            //上位机测试标志
extern int spdExp7;			//识别速度 10

extern int spdBas1;		//平跑基准速度,15
extern int spdBas2;		//过弯速度（小）10
extern int spdBas3;		//过弯速度（大),8
extern int spdBas4;			//射击速度，6

extern float speed_k1;            //changespeed_flag函数参数1
extern float speed_k2;           //changespeed_flag函数参数2

extern int KDet;			//差速计算参数
// extern float In_kdet;		//入库差速
// extern float Cir_kdet;		//环岛差速
// extern float Cross_kdet;		//大环差速
extern SPEED leftDrv;		//左轮速度类型PID
extern SPEED rightDrv;		//右轮速度类型PID
extern float g_speed_p;		//速度控制的P
extern float g_speed_i;		//速度控制的I
extern float g_speed_d;		//速度控制的D

// extern float Ramp_Speed_P;      //坡道速度控制的P
// extern float Ramp_Speed_I;	    //坡道速度控制的I
// extern float RamP_Speed_D;	    //坡道速度控制的D

extern char g_drive_flag;		    //电机启动标志，0关闭，1启动
extern int SpeedRow;			//控速边界行数

//==================控制====================
// extern int8 Stop_Flag;//停车标志，0=不停车，1=需要停车
// extern int8 Ramp_Open;//坡道开关，0=关，1=开
// extern int8 Garage_State;	//车库状态，0=关闭，1=出库,2=入库


//==============补图====================
extern int8 g_handle_open;				//补图开关 0=关，1=开
// extern int8 Img_StopLineFlag;       //图像判断停车线标志，0=无，1=有
extern int8 CircleFlag;				//环岛标志
// extern int8 Cross_Flag;				//大弯标志
 extern int8 Img_RampFlag;			//坡道标志(0:无)
// extern int8 Img_SpecialElemFlag ;    //特殊元素标志
// extern int8 Garage_Open;				//车库开关
extern int ProSpect;				//前瞻行
extern int ML_Count;				//中线有效行
extern int LeftIntLine ;		//记录左内跳行数
extern int RightIntLine;		//记录右内跳行数
extern int8 g_RoadType;			//赛道情况

extern int8 FindLineType;							//是否加入高光滤波标志
//----阈值----
extern int BrightThreshold;                      //亮阈值（坡道）

//----canny变量----
extern int HighThreshold;						//canny高阈值，50,40
extern int LowThreshold ;						//canny低阈值，20,16
extern int LightThreshold;						//去高光噪声阈值

extern int ML[IMG_ROW],LL[IMG_ROW],RL[IMG_ROW];//三线数组
extern uint8 (*image)[IMG_COL];	//摄像头数据接收
extern uint8 ImageEdge[IMG_ROW][IMG_COL]; 	//摄像头边缘判断数组
// extern int exp_time;//曝光时间
extern const int MidOffset[];		//中线偏移量
extern int8 ErrorFlag;				//补图错标志，0=正常

extern int8 g_camera_open;				//摄像头开关，0=关，1=开
extern int exp_time;	//摄像头曝光设置

//------点信息-------
extern SpecialPoint LeftPnt, RightPnt;					//保存左右特殊点信息

//---环岛----
extern int8 CircleState;				//环岛状态
extern int8 Img_CircleOpen;          //图像处理环岛开关
// extern int8 CircleFlagSet;          //手动设置环岛方向
// extern int8 LeftLost, RightLost;
// extern int8 ChangeFlag;

//---三叉---
extern char Forks_State;			//三叉状态 详见Forks.cpp
extern char Forks_Direct;			//三叉方向
extern char Circle_Again_Flag;		//圈数
extern char Dist_ClearFork5Flag;		//延距清三岔5标志
extern char FD_Now;	
extern char FD_Ready_Flag;
extern char FD_Clear_Flag;
extern char getA_Flag, getB_Flag,getC_Flag;
extern char FD_WaitFlag;
extern char Dist_Forks3Flag;	//延距清三叉2->3标志

extern int8 Img_SpecialElemFlag;     //特殊元素开关
//==================================刹车=================//
extern int g_stop_line;
extern int g_stop_dis;
extern int times_go;
extern int times_stop;
extern int rount;          //圈数
extern int DistantStop;		//累计编码器脉冲

extern float Distance;   //测量距离
extern int8 Img_StopOpen;            //停车线开关
extern int8 Img_StopLineFlag;        //检测停车线开关
extern int8 Get_StopLine;            //检测到停车线标志

extern int8 Dist_ClearSevenFlag;         //延距清环岛7状态
//==================任务====================
// extern int8 Shoot_Flag;//射击标志，0=不射击，1=需要射击
// extern int8 SlowDown_Flag;//减速识别标志，0=不需要减速，1=需要减速


//==================电磁====================
extern int ind_left;	//左电感值
extern int ind_mid;//中电感值
extern int ind_right;//右电感值


extern char protect_flag;        //电磁的保护标记（用于速度计算）

#endif 
